{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-------------load the model-----------------\n",
      "Train on 1310 samples, validate on 500 samples\n",
      "Epoch 1/40\n",
      "1310/1310 [==============================] - 3s 2ms/sample - loss: 0.6375 - sparse_categorical_accuracy: 0.6313 - val_loss: 0.5804 - val_sparse_categorical_accuracy: 0.6260\n",
      "Epoch 2/40\n",
      "1310/1310 [==============================] - 2s 2ms/sample - loss: 0.5335 - sparse_categorical_accuracy: 0.7511 - val_loss: 0.4947 - val_sparse_categorical_accuracy: 0.7880\n",
      "Epoch 3/40\n",
      "1310/1310 [==============================] - 2s 2ms/sample - loss: 0.4477 - sparse_categorical_accuracy: 0.8191 - val_loss: 0.3978 - val_sparse_categorical_accuracy: 0.8520\n",
      "Epoch 4/40\n",
      "1310/1310 [==============================] - 2s 2ms/sample - loss: 0.3996 - sparse_categorical_accuracy: 0.8244 - val_loss: 0.3956 - val_sparse_categorical_accuracy: 0.8360\n",
      "Epoch 5/40\n",
      "1310/1310 [==============================] - 2s 2ms/sample - loss: 0.3745 - sparse_categorical_accuracy: 0.8313 - val_loss: 0.3353 - val_sparse_categorical_accuracy: 0.8740\n",
      "Epoch 6/40\n",
      "1310/1310 [==============================] - 2s 2ms/sample - loss: 0.3470 - sparse_categorical_accuracy: 0.8611 - val_loss: 0.3213 - val_sparse_categorical_accuracy: 0.8720\n",
      "Epoch 7/40\n",
      "1310/1310 [==============================] - 2s 1ms/sample - loss: 0.3256 - sparse_categorical_accuracy: 0.8550 - val_loss: 0.3262 - val_sparse_categorical_accuracy: 0.8740\n",
      "Epoch 8/40\n",
      "1310/1310 [==============================] - 2s 2ms/sample - loss: 0.3187 - sparse_categorical_accuracy: 0.8702 - val_loss: 0.3067 - val_sparse_categorical_accuracy: 0.8820\n",
      "Epoch 9/40\n",
      "1310/1310 [==============================] - 2s 1ms/sample - loss: 0.3223 - sparse_categorical_accuracy: 0.8550 - val_loss: 0.3168 - val_sparse_categorical_accuracy: 0.8640\n",
      "Epoch 10/40\n",
      "1310/1310 [==============================] - 2s 2ms/sample - loss: 0.2991 - sparse_categorical_accuracy: 0.8664 - val_loss: 0.2832 - val_sparse_categorical_accuracy: 0.8840\n",
      "Epoch 11/40\n",
      "1310/1310 [==============================] - 2s 1ms/sample - loss: 0.2991 - sparse_categorical_accuracy: 0.8695 - val_loss: 0.2975 - val_sparse_categorical_accuracy: 0.8720\n",
      "Epoch 12/40\n",
      "1310/1310 [==============================] - 3s 2ms/sample - loss: 0.2776 - sparse_categorical_accuracy: 0.8824 - val_loss: 0.2933 - val_sparse_categorical_accuracy: 0.8760725 - sparse_categorical_accura\n",
      "Epoch 13/40\n",
      "1310/1310 [==============================] - 3s 2ms/sample - loss: 0.2758 - sparse_categorical_accuracy: 0.8725 - val_loss: 0.2713 - val_sparse_categorical_accuracy: 0.8860\n",
      "Epoch 14/40\n",
      "1310/1310 [==============================] - 3s 2ms/sample - loss: 0.2792 - sparse_categorical_accuracy: 0.8794 - val_loss: 0.2883 - val_sparse_categorical_accuracy: 0.8760\n",
      "Epoch 15/40\n",
      "1310/1310 [==============================] - 3s 2ms/sample - loss: 0.2692 - sparse_categorical_accuracy: 0.8847 - val_loss: 0.2673 - val_sparse_categorical_accuracy: 0.8920\n",
      "Epoch 16/40\n",
      "1310/1310 [==============================] - 3s 2ms/sample - loss: 0.2633 - sparse_categorical_accuracy: 0.8885 - val_loss: 0.2719 - val_sparse_categorical_accuracy: 0.8820\n",
      "Epoch 17/40\n",
      "1310/1310 [==============================] - 3s 2ms/sample - loss: 0.2704 - sparse_categorical_accuracy: 0.8840 - val_loss: 0.2727 - val_sparse_categorical_accuracy: 0.8940\n",
      "Epoch 18/40\n",
      "1310/1310 [==============================] - 3s 2ms/sample - loss: 0.2602 - sparse_categorical_accuracy: 0.8916 - val_loss: 0.2609 - val_sparse_categorical_accuracy: 0.8920\n",
      "Epoch 19/40\n",
      "1310/1310 [==============================] - 3s 2ms/sample - loss: 0.2477 - sparse_categorical_accuracy: 0.8947 - val_loss: 0.2767 - val_sparse_categorical_accuracy: 0.8820\n",
      "Epoch 20/40\n",
      "1310/1310 [==============================] - 3s 2ms/sample - loss: 0.2493 - sparse_categorical_accuracy: 0.8947 - val_loss: 0.2611 - val_sparse_categorical_accuracy: 0.8860\n",
      "Epoch 21/40\n",
      "1310/1310 [==============================] - 3s 2ms/sample - loss: 0.2399 - sparse_categorical_accuracy: 0.8962 - val_loss: 0.2744 - val_sparse_categorical_accuracy: 0.8780\n",
      "Epoch 22/40\n",
      "1310/1310 [==============================] - 3s 2ms/sample - loss: 0.2467 - sparse_categorical_accuracy: 0.8901 - val_loss: 0.2540 - val_sparse_categorical_accuracy: 0.8940\n",
      "Epoch 23/40\n",
      "1310/1310 [==============================] - 3s 2ms/sample - loss: 0.2440 - sparse_categorical_accuracy: 0.8893 - val_loss: 0.2524 - val_sparse_categorical_accuracy: 0.9020\n",
      "Epoch 24/40\n",
      "1310/1310 [==============================] - 3s 2ms/sample - loss: 0.2369 - sparse_categorical_accuracy: 0.8939 - val_loss: 0.2504 - val_sparse_categorical_accuracy: 0.9020\n",
      "Epoch 25/40\n",
      "1310/1310 [==============================] - 3s 2ms/sample - loss: 0.2332 - sparse_categorical_accuracy: 0.9008 - val_loss: 0.2588 - val_sparse_categorical_accuracy: 0.8900\n",
      "Epoch 26/40\n",
      "1310/1310 [==============================] - 3s 2ms/sample - loss: 0.2302 - sparse_categorical_accuracy: 0.9023 - val_loss: 0.2487 - val_sparse_categorical_accuracy: 0.9000\n",
      "Epoch 27/40\n",
      "1310/1310 [==============================] - 3s 2ms/sample - loss: 0.2368 - sparse_categorical_accuracy: 0.9023 - val_loss: 0.2510 - val_sparse_categorical_accuracy: 0.8980\n",
      "Epoch 28/40\n",
      "1310/1310 [==============================] - 3s 2ms/sample - loss: 0.2241 - sparse_categorical_accuracy: 0.9031 - val_loss: 0.2507 - val_sparse_categorical_accuracy: 0.9020\n",
      "Epoch 29/40\n",
      "1310/1310 [==============================] - 3s 2ms/sample - loss: 0.2218 - sparse_categorical_accuracy: 0.9046 - val_loss: 0.2446 - val_sparse_categorical_accuracy: 0.9040\n",
      "Epoch 30/40\n",
      "1310/1310 [==============================] - 3s 2ms/sample - loss: 0.2189 - sparse_categorical_accuracy: 0.9092 - val_loss: 0.2427 - val_sparse_categorical_accuracy: 0.9060\n",
      "Epoch 31/40\n",
      "1310/1310 [==============================] - 3s 2ms/sample - loss: 0.2146 - sparse_categorical_accuracy: 0.9046 - val_loss: 0.2736 - val_sparse_categorical_accuracy: 0.8880\n",
      "Epoch 32/40\n",
      "1310/1310 [==============================] - 3s 2ms/sample - loss: 0.2132 - sparse_categorical_accuracy: 0.9145 - val_loss: 0.2526 - val_sparse_categorical_accuracy: 0.8920\n",
      "Epoch 33/40\n",
      "1310/1310 [==============================] - 3s 2ms/sample - loss: 0.2248 - sparse_categorical_accuracy: 0.9015 - val_loss: 0.2522 - val_sparse_categorical_accuracy: 0.8900\n",
      "Epoch 34/40\n",
      "1310/1310 [==============================] - 3s 2ms/sample - loss: 0.2062 - sparse_categorical_accuracy: 0.9130 - val_loss: 0.2421 - val_sparse_categorical_accuracy: 0.8960\n",
      "Epoch 35/40\n",
      "1310/1310 [==============================] - 3s 2ms/sample - loss: 0.2106 - sparse_categorical_accuracy: 0.9107 - val_loss: 0.2622 - val_sparse_categorical_accuracy: 0.8880\n",
      "Epoch 36/40\n",
      "1310/1310 [==============================] - 3s 2ms/sample - loss: 0.2035 - sparse_categorical_accuracy: 0.9176 - val_loss: 0.2416 - val_sparse_categorical_accuracy: 0.9020\n",
      "Epoch 37/40\n",
      "1310/1310 [==============================] - 3s 2ms/sample - loss: 0.1992 - sparse_categorical_accuracy: 0.9191 - val_loss: 0.2600 - val_sparse_categorical_accuracy: 0.8960\n",
      "Epoch 38/40\n",
      "1310/1310 [==============================] - 3s 2ms/sample - loss: 0.2093 - sparse_categorical_accuracy: 0.9107 - val_loss: 0.2364 - val_sparse_categorical_accuracy: 0.9040\n",
      "Epoch 39/40\n",
      "1310/1310 [==============================] - 3s 2ms/sample - loss: 0.1945 - sparse_categorical_accuracy: 0.9206 - val_loss: 0.2500 - val_sparse_categorical_accuracy: 0.8960\n",
      "Epoch 40/40\n",
      "1310/1310 [==============================] - 3s 3ms/sample - loss: 0.1932 - sparse_categorical_accuracy: 0.9198 - val_loss: 0.2355 - val_sparse_categorical_accuracy: 0.9040\n",
      "Model: \"sequential_11\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "conv2d_22 (Conv2D)           (None, 32, 32, 32)        896       \n",
      "_________________________________________________________________\n",
      "max_pooling2d_22 (MaxPooling (None, 16, 16, 32)        0         \n",
      "_________________________________________________________________\n",
      "conv2d_23 (Conv2D)           (None, 16, 16, 32)        9248      \n",
      "_________________________________________________________________\n",
      "max_pooling2d_23 (MaxPooling (None, 8, 8, 32)          0         \n",
      "_________________________________________________________________\n",
      "flatten_11 (Flatten)         (None, 2048)              0         \n",
      "_________________________________________________________________\n",
      "dense_22 (Dense)             (None, 128)               262272    \n",
      "_________________________________________________________________\n",
      "dense_23 (Dense)             (None, 2)                 258       \n",
      "=================================================================\n",
      "Total params: 272,674\n",
      "Trainable params: 272,674\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n",
      "save\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import tensorflow as tf\n",
    "from PIL import Image\n",
    "import numpy as np\n",
    "import os\n",
    "from matplotlib import pyplot as plt\n",
    "from tensorflow.keras.layers import Conv2D, BatchNormalization, Activation, MaxPool2D, Dropout, Flatten, Dense\n",
    "from tensorflow.keras import Model\n",
    "import json\n",
    "\n",
    "train_path = 'melon6/total/'\n",
    "train_txt = 'melon6/train.txt'\n",
    "test_path = 'melon6/total/'\n",
    "test_txt = 'melon6/test.txt'\n",
    "\n",
    "def generateds(path, txt):\n",
    "    f = open(txt, 'r')  # 以只读形式打开txt文件\n",
    "    contents = f.readlines()  # 读取文件中所有行\n",
    "    f.close()  # 关闭txt文件\n",
    "    x, y_ = [], []  # 建立空列表\n",
    "    for content in contents:  # 逐行取出\n",
    "        value = content.split()  # 以空格分开，图片路径为value[0] , 标签为value[1] , 存入列表\n",
    "        img_path = path + value[0]  # 拼出图片路径和文件名\n",
    "#         print(img_path)\n",
    "        img = Image.open(img_path)  # 读入图片\n",
    "        img = np.array(img.convert('RGB'))  # 图片变为8位宽灰度值的np.array格式\n",
    "#         img = np.array(img.convert('L'))  # 图片变为8位宽灰度值的np.array格式\n",
    "        img = img / 255.  # 数据归一化 （实现预处理）\n",
    "#         print(img)\n",
    "        x.append(img)  # 归一化后的数据，贴到列表x\n",
    "        y_.append(value[1])  # 标签贴到列表y_\n",
    "#         print('loading : ' + content)  # 打印状态提示\n",
    "\n",
    "    x = np.array(x)  # 变为np.array格式\n",
    "    y_ = np.array(y_)  # 变为np.array格式\n",
    "    y_ = y_.astype(np.int64)  # 变为64位整型\n",
    "    return x, y_  # 返回输入特征x，返回标签y_\n",
    "\n",
    "\n",
    "\n",
    "x_train, y_train = generateds(train_path, train_txt)\n",
    "x_test, y_test = generateds(test_path, test_txt)\n",
    "\n",
    "    \n",
    "##################网络结构##################\n",
    "model = tf.keras.models.Sequential([\n",
    "    tf.keras.layers.Conv2D(32, (3, 3),padding='SAME', activation='relu', input_shape=(32, 32, 3)),\n",
    "    tf.keras.layers.MaxPooling2D(2, 2),\n",
    "    tf.keras.layers.Conv2D(32, (3, 3), padding='SAME', activation='relu'),\n",
    "    tf.keras.layers.MaxPooling2D(2, 2),\n",
    "    tf.keras.layers.Flatten(),\n",
    "    tf.keras.layers.Dense(128, activation=tf.nn.relu),\n",
    "    tf.keras.layers.Dense(2, activation=tf.nn.softmax)\n",
    "])\n",
    "\n",
    "\n",
    "model.compile(optimizer=tf.keras.optimizers.Adam(0.0001),\n",
    "              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),\n",
    "              metrics=['sparse_categorical_accuracy'])\n",
    "\n",
    "checkpoint_save_path = \"checkpoint/CNN.ckpt\"\n",
    "\n",
    "if os.path.exists(checkpoint_save_path + '.index'):\n",
    "    print('-------------load the model-----------------')\n",
    "#     model.load_weights(checkpoint_save_path)\n",
    "\n",
    "cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_save_path,\n",
    "                                                 save_weights_only=True,\n",
    "                                                 save_best_only=True)\n",
    "\n",
    "\n",
    "history = model.fit(x_train, y_train, batch_size=32, epochs=40, validation_data=(x_test, y_test)\n",
    "                    , validation_freq=1,callbacks=[cp_callback]\n",
    "                   )\n",
    "\n",
    "model.summary()\n",
    "\n",
    "\n",
    "# print(model.trainable_variables)\n",
    "file = open('CNNweights.txt', 'w')\n",
    "for v in model.trainable_variables:\n",
    "    file.write(str(v.name) + '\\n')\n",
    "    file.write(str(v.shape) + '\\n')\n",
    "    file.write(str(v.numpy()) + '\\n')\n",
    "file.close()\n",
    "\n",
    "model.save('CNN.h5')\n",
    "print(\"save\")\n",
    "\n",
    "###############################################    show   ###############################################\n",
    "\n",
    "# 显示训练集和验证集的acc和loss曲线\n",
    "acc = history.history['sparse_categorical_accuracy']\n",
    "val_acc = history.history['val_sparse_categorical_accuracy']\n",
    "loss = history.history['loss']\n",
    "val_loss = history.history['val_loss']\n",
    "\n",
    "plt.subplot(1, 2, 1)\n",
    "plt.plot(acc, label='Training Accuracy')\n",
    "plt.plot(val_acc, label='Validation Accuracy')\n",
    "plt.title('Training and Validation Accuracy')\n",
    "plt.legend()\n",
    "\n",
    "plt.subplot(1, 2, 2)\n",
    "plt.plot(loss, label='Training Loss')\n",
    "plt.plot(val_loss, label='Validation Loss')\n",
    "plt.title('Training and Validation Loss')\n",
    "plt.legend()\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
